#include "infanterie.h"

Infanterie::Infanterie(sf::Vector2f position, std::string image, int nb_image, Arme arme,
               int sous_type,int equipe) : Unite(position,"",IntRect(0,0,0,0),equipe)
{
    Option m_option;
    m_soustype = sous_type;
    m_arme = arme;
    m_spriteinfant.Charger(image, nb_image);
    m_type = INFANT;
    time_imprecision = 0;
    time_viseur = 0;
    m_physique = true;
    time_c4 = 0;
    m_angleviseur = 0;
    id_sniper_vise = 0;
    imprecision = sf::Vector2f(0,0);
    sniper_vise = false;
    direction_viseurx = false;
    direction_viseury = false;
    m_arme.SetFlip(false);
    if(!m_image_c4.LoadFromFile("picture/map/c4.png"))
    {
        cout << "Impossible de charger la c4.." << endl;
    }
    else
    {
        m_sprite_c4.SetTexture(m_image_c4);
        m_sprite_c4.setOrigin(m_image_c4.GetWidth()/2,m_image_c4.GetHeight());
    }
    if (m_soustype == SNIPER)
    {
        is_sniper = true;

    }
    if(!m_viseur_image.LoadFromFile("Picture/map/viseur_infant.png"))
    {
        cout << "Impossible de charger le viseur de l'infanterie..." << endl;
    }
    else
    {
        m_viseur.SetTexture(m_viseur_image);
        m_viseur.SetScale(0.5,0.5);
        m_viseur.setOrigin(-45,m_viseur.GetSize().y/2);
    }
    if(!m_viseursnip_image.LoadFromFile("Picture/map/viseur.png"))
    {
        cout << "Impossible de charger le viseur des snipers..." << endl;
    }
    else
    {
        m_viseursnip.SetTexture(m_viseursnip_image);
        m_viseursnip.setOrigin(m_viseursnip.GetSize().x/2,m_viseursnip.GetSize().y/2);
    }
    if(!m_bufferpas.LoadFromFile("sounds/pas_soldat.ogg"))
    {
        cout << "Impossible de charger les pas des soldats..." << endl;
    }
    else
    {
        m_soundpas.SetBuffer(m_bufferpas);
        m_soundpas.SetVolume(m_option.GetVolume()/2);
        m_soundpas.SetLoop(true);
    }
}
Infanterie::Infanterie(sf::Vector2f position, std::string image, int nb_image, Missile arme,
               int sous_type,int equipe) : Unite(position,"",IntRect(0,0,0,0),equipe)
{
    Option m_option;
    m_soustype = sous_type;
    m_missile = arme;
    sniper_vise = false;
    m_spriteinfant.Charger(image, nb_image);
    m_type = INFANT;
    is_sniper = false;
    id_sniper_vise = 0;
    imprecision = sf::Vector2f(0,0);
    if (m_soustype == SNIPER)
    {
        is_sniper = true;

    }
    m_physique = true;
    m_angleviseur = 0;
    m_arme.SetFlip(false);
    if(!m_viseur_image.LoadFromFile("Picture/map/viseur_infant.png"))
    {
        cout << "Impossible de charger le viseur de l'infanterie..." << endl;
    }
    else
    {
        m_viseur.SetTexture(m_viseur_image);
        m_viseur.SetScale(0.5,0.5);
        m_viseur.setOrigin(-45,m_viseur.GetSize().y/2);
    }
    if(!m_bufferpas.LoadFromFile("sounds/pas_soldat.ogg"))
    {
        cout << "Impossible de charger les pas des soldats..." << endl;
    }
    else
    {
        m_soundpas.SetBuffer(m_bufferpas);
        m_soundpas.SetVolume(m_option.GetVolume()/2);
        m_soundpas.SetLoop(true);
    }
}
Infanterie::~Infanterie()
{
}
void Infanterie::Afficher(sf::RenderWindow *app,sf::Vector2f vent, Terrain *terre, Game *jeu, std::vector<sf::Sprite> unite, bool visible)
{
    if(c4_is_active)
    {
        if(clock.GetElapsedTime()-time_c4 > 3)
        {
            c4_is_active = false;
            time_c4 = false;
            jeu->degat(120, m_sprite_c4.GetPosition(), 200, false,0,false);
        }
    }
    if(!m_sound)
    {
        m_soundpas.Stop();
    }
    m_sound = false;
    if(enTire)
    {
        if(m_soustype == TECH)
        {
            m_missile.Deplacer(vent,terre,jeu,unite);
            m_missile.Afficher(app);
        }
        else
        {
            m_arme.Deplacer(vent,terre,jeu,unite);
            m_arme.AfficherTir(app);
        }
    }
    if(visible)
    {
        if(!inBatiment)
        {
            m_spriteinfant.SetPosition(m_position);
            m_spriteinfant.Afficher(app);
        }
        m_viseur.SetPosition(m_position+Vector2f(0,-m_spriteinfant.GetHeight()/2));
        m_viseur.SetRotation(m_angleviseur);
        app->Draw(m_viseur);
        m_spriteequipe.SetPosition(m_position.x, m_position.y-m_spriteinfant.GetHeight()-40);
        m_spritevie.SetPosition(m_position.x-30, m_position.y-m_spriteinfant.GetHeight()-25);
        app->Draw(m_spritevie);
        app->Draw(m_spriteequipe);
    }
}
void Infanterie::AfficherGui(RenderWindow *app)
{
    if(sniper_vise)
    {
        app->Draw(m_viseursnip);
    }
}
void Infanterie::avancer(Terrain *terre)
{
    m_spriteinfant.FlipX(0);
    if(flip)
        m_angleviseur = 180-m_angleviseur;
    flip = false;
    if(m_position.y - terre->cherTerrain(m_position.x+m_deplacement,m_position.y) < 20 && m_position.x+m_deplacement+20 < terre->GetTextureSize().x)
    {
        m_position.x += m_deplacement+bonus_deplacement;
    }
}
void Infanterie::reculer(Terrain *terre)
{
    m_spriteinfant.FlipX(1);
    if(!flip)
        m_angleviseur = 180-m_angleviseur;
    flip = true;
    if(m_position.y - terre->cherTerrain(m_position.x-m_deplacement,m_position.y) < 20 && m_position.x-m_deplacement-20 >0)
    {
        m_position.x -= m_deplacement+bonus_deplacement;
    }
}
void Infanterie::SetAnim(bool animer)
{
    m_spriteinfant.SetAnim(animer);
}
bool Infanterie::Evenement(int input, sf::RenderWindow *app, Terrain *terre, Game *jeu)
{
    m_sound = true;
    if(input == 1)
    {
        ajouterAngle();
    }
    if(input == 2)
    {
        retirerAngle();
    }
    if(input == 3 && !inBatiment)
    {
        if(!sniper_vise)
        {
            if(m_soundpas.GetStatus() == sf::Sound::Stopped)
            {
                m_soundpas.Play();
            }
            avancer(terre);
            SetAnim(true);
        }
        else
        {
            if(clock.GetElapsedTime()-time_viseur> 0.3)
            {
                id_sniper_vise++;
                if(id_sniper_vise >= jeu->GetUnite().size())
                {
                    id_sniper_vise = 0;
                }
                while(jeu->GetUnite()[id_sniper_vise]->GetEquipe() == m_equipe || jeu->GetUnite()[id_sniper_vise]->IsDead())
                {
                    id_sniper_vise++;
                    if(id_sniper_vise >= jeu->GetUnite().size())
                    {
                        id_sniper_vise = 0;
                    }
                }
                time_viseur = clock.GetElapsedTime();
            }
        }
    }
    else if(input == 4 && !inBatiment)
    {
        if(!sniper_vise)
        {
            if(m_soundpas.GetStatus() == Sound::Stopped)
            {
                m_soundpas.Play();
            }
            reculer(terre);
            SetAnim(true);
        }
        else
        {
            if(clock.GetElapsedTime()-time_viseur> 0.3)
            {
                id_sniper_vise--;
                if(id_sniper_vise < 0)
                {
                    id_sniper_vise = jeu->GetUnite().size()-1;
                }
                while(jeu->GetUnite()[id_sniper_vise]->GetEquipe() == m_equipe || jeu->GetUnite()[id_sniper_vise]->IsDead())
                {
                    id_sniper_vise--;
                    if(id_sniper_vise < 0)
                    {
                        id_sniper_vise = jeu->GetUnite().size()-1;
                    }
                }
                time_viseur = clock.GetElapsedTime();
            }
        }
    }
    else if(input == 6)
    {
        m_soundpas.Stop();
        SetAnim(false);
    }
    if(input == 5)
    {
        if(!sniper_vise)
        {
            if(m_soustype == SNIPER)
            {
                sniper_vise = true;
                id_sniper_vise++;
                if(id_sniper_vise >= jeu->GetUnite().size())
                {
                    id_sniper_vise = 0;
                }
                while(jeu->GetUnite()[id_sniper_vise]->GetEquipe() == m_equipe || jeu->GetUnite()[id_sniper_vise]->IsDead())
                {
                    id_sniper_vise++;
                    if(id_sniper_vise >= jeu->GetUnite().size())
                    {
                        id_sniper_vise = 0;
                    }
                }
            }
            else
                tirer(jeu);
        }
        else
        {
            sniper_vise = false;
            tirer(jeu);
        }
    }
    if(input == 10)
    {
        if(m_can_create_batiment)
        {
            jeu->AjouterBatiment(m_equipe, m_soustype, 0, m_position);
            m_can_create_batiment = false;
        }
    }
    if(input == 11)
    {
        if(m_can_create_batiment)
        {
            jeu->AjouterBatiment(m_equipe, m_soustype, 1, m_position);
            m_can_create_batiment = false;
        }
    }
    if(input == 12)
    {
        m_spe1 = false;
        if(m_soustype == SOLDAT)
        {
            c4_is_active = true;
            m_sprite_c4.SetPosition(m_position);
            time_c4 = clock.GetElapsedTime();
        }
    }
    m_position_viseur = jeu->GetUnite()[id_sniper_vise]->GetPosition();
    if(clock.GetElapsedTime()-time_imprecision > 0.005)
    {
        if(sniper_vise)
        {
            if(direction_viseurx)
                imprecision.x+=2;
            else
                imprecision.x-=2;
            if(imprecision.x > 52)
                direction_viseurx = false;
            else if(imprecision.x<-52)
                direction_viseurx = true;
            if(direction_viseury)
                imprecision.y+=2;
            else
                imprecision.y-=2;
            if(imprecision.y > 26)
                direction_viseury = false;
            else if(imprecision.y < -26)
                direction_viseury = true;
            m_viseursnip.SetPosition(sf::Vector2f(m_position_viseur.x+imprecision.x, m_position_viseur.y-15+(imprecision.y)))
            ;
        }
        time_imprecision = clock.GetElapsedTime();
    }
    if(clock.GetElapsedTime()-time > 0.1)
    {
        m_spriteinfant.Change();
        time = clock.GetElapsedTime();
    }
    return 1;
}
void Infanterie::ajouterAngle()
{
    if(flip)
    {
        if(m_angleviseur >= 155)
        {
            m_angleviseur--;
        }
        else
        {
            m_angleviseur = 155;
        }
    }
    else
    {
        if(m_angleviseur <= 25)
        {
            m_angleviseur++;
        }
        else
        {
            m_angleviseur = 25;
        }
    }
}
void Infanterie::retirerAngle()
{
    if(flip)
    {
        if(m_angleviseur <= 205)
        {
            m_angleviseur++;
        }
        else
        {
            m_angleviseur = 205;
        }
    }
    else
    {
        if(m_angleviseur >= -25)
        {
            m_angleviseur--;
        }
        else
        {
            m_angleviseur = -25;
        }
    }
}
void Infanterie::tirer(Game *jeu)
{
    if(m_soustype == TECH)
    {
        if(flip)
            m_missile.tirer(10,m_angleviseur, m_position+sf::Vector2f(-10,-m_spriteinfant.GetHeight()/2), sf::Vector2f(0,0),flip);
        else
            m_missile.tirer(10,m_angleviseur, m_position+sf::Vector2f(10,-m_spriteinfant.GetHeight()/2), sf::Vector2f(0,0),flip);
    }
    else if(m_soustype == SNIPER)
    {
        sf::Sprite sprite_tmp = jeu->GetUnite()[id_sniper_vise]->GetSurface();
        if(CollisionBoiteVector(sprite_tmp,m_viseursnip.GetPosition()))
        {
            jeu->degat(0,m_position_viseur,m_arme.GetDegat(),true,id_sniper_vise,true);
        }
        jeu->finTire();
    }
    else
    {
        if(flip)
            m_arme.Tirer(m_angleviseur,m_position+sf::Vector2f(-10,-m_spriteinfant.GetHeight()/2),flip);
        else
            m_arme.Tirer(m_angleviseur,m_position+sf::Vector2f(10,-m_spriteinfant.GetHeight()/2),flip);
    }
    enTire = true;
}
sf::Sprite Infanterie::GetSurface()
{
    return m_spriteinfant.GetSprite();
}
sf::Vector2f Infanterie::GetRoquettePosition()
{
    if(m_soustype == TECH)
        return m_missile.GetPosition();
    else
        return m_arme.GetPosition();
}
sf::Vector2f Infanterie::GetPosition()
{
    if(sniper_vise)
    {
        return m_position_viseur;
    }
    else
        return m_position;
}
